<!DOCTYPE html>
<html lang="zh" xmlns:th="http://www.thymeleaf.org">
<head th:replace="layouts/header :: head('JMX配置指南 - 监控工具平台')">
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>JMX配置指南 - 监控工具平台</title>
    <link rel="stylesheet" href="/monitoring/css/element-ui.css">
    <link rel="stylesheet" href="/monitoring/css/custom.css">
</head>
<body>
    <!-- 使用公共头部 -->
    <div th:replace="layouts/header :: header"></div>

    <div id="app" class="container">
        <h1>JMX配置指南</h1>
        
        <el-alert
            title="JMX是Java平台的管理扩展"
            type="info"
            :closable="false"
            show-icon>
            <span>JMX允许您监控和管理Java虚拟机及其相关组件，如内存使用、线程状态、GC活动等。</span>
        </el-alert>
        
        <el-card class="box-card mt-20">
            <div slot="header" class="clearfix">
                <span>1. 配置目标Java应用</span>
            </div>
            <div>
                <p>要启用JMX远程连接，您需要在<strong>目标Java应用</strong>启动时添加以下JVM参数：</p>
                <pre class="code-block">
java -Dcom.sun.management.jmxremote \
     -Dcom.sun.management.jmxremote.port=9999 \
     -Dcom.sun.management.jmxremote.authenticate=false \
     -Dcom.sun.management.jmxremote.ssl=false \
     -Djava.rmi.server.hostname=localhost \
     -jar your-application.jar
</pre>
                
                <p><strong>参数说明：</strong></p>
                <ul>
                    <li><code>-Dcom.sun.management.jmxremote</code>: 启用JMX远程监控</li>
                    <li><code>-Dcom.sun.management.jmxremote.port=9999</code>: 设置JMX连接端口（可自定义）</li>
                    <li><code>-Dcom.sun.management.jmxremote.authenticate=false</code>: 不启用认证（生产环境建议启用）</li>
                    <li><code>-Dcom.sun.management.jmxremote.ssl=false</code>: 不启用SSL（生产环境建议启用）</li>
                    <li><code>-Djava.rmi.server.hostname=localhost</code>: 设置RMI服务器主机名</li>
                </ul>
                
                <p><strong>注意：</strong></p>
                <ul>
                    <li>生产环境应该启用认证和SSL以确保安全</li>
                    <li>将<code>localhost</code>替换为实际服务器IP或域名，特别是在网络环境中</li>
                    <li>确保所选端口未被其他应用占用</li>
                </ul>
            </div>
        </el-card>
        
        <el-card class="box-card mt-20">
            <div slot="header" class="clearfix">
                <span>2. 在监控工具中配置JMX连接</span>
            </div>
            <div>
                <p>配置好目标Java应用后，在监控工具的配置页面中设置以下信息：</p>
                
                <ol>
                    <li>启用JVM监控开关</li>
                    <li>设置JMX URL，格式为: <code>service:jmx:rmi:///jndi/rmi://[hostname]:[port]/jmxrmi</code></li>
                    <li>如启用了认证，填写用户名和密码</li>
                </ol>
                
                <p><strong>示例JMX URL：</strong></p>
                <ul>
                    <li>本地连接: <code>service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi</code></li>
                    <li>远程连接: <code>service:jmx:rmi:///jndi/rmi://192.168.1.100:9999/jmxrmi</code></li>
                </ul>
            </div>
        </el-card>
        
        <el-card class="box-card mt-20">
            <div slot="header" class="clearfix">
                <span>3. 测试JMX连接</span>
            </div>
            <div>
                <p>我们提供了两个实用工具来帮助您测试JMX连接：</p>
                
                <h3>3.1 测试工具</h3>
                <p>运行以下命令来测试JMX连接：</p>
                <pre class="code-block">
java -cp target/classes com.example.monitoring.utils.JmxConnectionTester [hostname] [port]
</pre>
                <p>示例: <code>java -cp target/classes com.example.monitoring.utils.JmxConnectionTester localhost 9999</code></p>
                
                <h3>3.2 示例JMX应用</h3>
                <p>运行以下示例程序来启动一个带有JMX功能的应用：</p>
                <pre class="code-block">
java -Dcom.sun.management.jmxremote \
     -Dcom.sun.management.jmxremote.port=9999 \
     -Dcom.sun.management.jmxremote.authenticate=false \
     -Dcom.sun.management.jmxremote.ssl=false \
     -Djava.rmi.server.hostname=localhost \
     -cp target/classes com.example.monitoring.utils.EnableJmxForMonitoring
</pre>
                <p>然后使用JConsole或我们的监控工具连接到此应用。</p>
                
                <h3>3.3 JConsole</h3>
                <p>Java自带的JConsole工具也可用于测试JMX连接：</p>
                <ol>
                    <li>在命令行中运行: <code>jconsole</code></li>
                    <li>选择"远程进程"并输入: <code>service:jmx:rmi:///jndi/rmi://localhost:9999/jmxrmi</code></li>
                    <li>如果有用户名密码，输入凭据</li>
                    <li>点击"连接"测试连接是否成功</li>
                </ol>
            </div>
        </el-card>
        
        <el-card class="box-card mt-20">
            <div slot="header" class="clearfix">
                <span>4. 常见问题排查</span>
            </div>
            <div>
                <h3>连接被拒绝</h3>
                <ul>
                    <li>确认目标JVM是否已启动并正确配置JMX参数</li>
                    <li>检查端口是否被防火墙阻止</li>
                    <li>尝试使用telnet测试端口: <code>telnet localhost 9999</code></li>
                </ul>
                
                <h3>认证失败</h3>
                <ul>
                    <li>检查用户名和密码是否正确</li>
                    <li>验证目标JVM的JMX安全配置</li>
                </ul>
                
                <h3>其他常见错误</h3>
                <table class="error-table">
                    <tr>
                        <th>错误信息</th>
                        <th>可能原因</th>
                        <th>解决方法</th>
                    </tr>
                    <tr>
                        <td>non-JRMP server at remote endpoint</td>
                        <td>RMI端口被其他非RMI服务占用</td>
                        <td>更换JMX端口或停止占用该端口的服务</td>
                    </tr>
                    <tr>
                        <td>Connection refused</td>
                        <td>目标JVM未启动或端口未开放</td>
                        <td>确保目标JVM已启动并正确配置JMX端口</td>
                    </tr>
                    <tr>
                        <td>hostname not resolved</td>
                        <td>主机名无法解析</td>
                        <td>使用IP地址代替主机名，或更新hosts文件</td>
                    </tr>
                </table>
            </div>
        </el-card>
    </div>
    
    <script src="/monitoring/js/vue.min.js"></script>
    <script src="/monitoring/js/element-ui.js"></script>
    <script>
        new Vue({
            el: '#app'
        });
    </script>
    
    <style>
        .container {
            padding: 20px;
            max-width: 1200px;
            margin: 0 auto;
        }
        h1 {
            margin-bottom: 20px;
            font-size: 24px;
        }
        .mt-20 {
            margin-top: 20px;
        }
        .code-block {
            background-color: #f5f5f5;
            padding: 15px;
            border-radius: 5px;
            overflow-x: auto;
            font-family: monospace;
        }
        .error-table {
            width: 100%;
            border-collapse: collapse;
            margin-top: 15px;
        }
        .error-table th, .error-table td {
            border: 1px solid #ddd;
            padding: 8px;
            text-align: left;
        }
        .error-table th {
            background-color: #f2f2f2;
        }
        .error-table tr:nth-child(even) {
            background-color: #f9f9f9;
        }
    </style>
</body>
</html> 